/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import dtos.VendaDTO;
import entidades.Farmacia;
import entidades.LinhaVenda;
import entidades.ProdutoCatalogo;
import entidades.Stock;
import entidades.Venda;
import excecoes.EntidadeExistenteException;
import excecoes.EntidadeNaoExistenteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.EJBException;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

/**
 *
 * @author Joel
 */
@Stateless
public class VendaBean {

    @PersistenceContext
    private EntityManager em;
    private LinhaVendaBean lvb;

    public void criarVenda(int id, Date data, int codFarmacia) throws EntidadeExistenteException{
        try {
            if(existeVenda(id)){
                throw new EntidadeExistenteException("Já existe uma venda com o id pretendido!");
            }
             Farmacia farmacia = em.find(Farmacia.class, codFarmacia);
            if(farmacia == null){
                throw new EntidadeNaoExistenteException("Farmácia não existente!");
            }
            em.persist(new Venda(id, data, farmacia));
        } catch (EntidadeExistenteException e) {
            throw e;
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public boolean existeVenda(int id) {
        return em.find(Venda.class, id) != null;
    }
    
    public void fecharVenda(int vendaId, int codFarmacia){
        try {   
            Venda venda = em.find(Venda.class, vendaId);
            Farmacia farmacia = em.find(Farmacia.class, codFarmacia);
            if(farmacia == null){
                throw new EntidadeNaoExistenteException("Farmácia não existente!");
            }
            for (LinhaVenda linhaVenda : venda.getListaLinhasVenda()) {
                for (Stock stock : farmacia.getArmazem().getStocks()) {
                    if(linhaVenda.getProdutoCatalogo().getReferencia().equals(stock.getProdutoCatalogo().getReferencia())){
                        stock.setQuantidade(stock.getQuantidade() - linhaVenda.getQuantidade());
                        em.merge(stock);
                    }
                }
            }
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void adicionarLinhaVenda(int vendaId, int idProduto, int quantidade){
        try {
            Venda venda = em.find(Venda.class, vendaId);
            if (venda == null) {
                throw new EntidadeNaoExistenteException("Venda não existente!");
            }
            ProdutoCatalogo produtoCatalogo = em.find(ProdutoCatalogo.class, idProduto);
            if (produtoCatalogo == null) {
                throw new EntidadeNaoExistenteException("Produto catalogo não existente!");
            }
            lvb.criarLinhaVenda(venda.getNextLinhaVendaId(), venda, quantidade, produtoCatalogo);
        
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void removerLinhaVenda(int vendaId, int linhaVendaId){
        try {
            Venda v = em.find(Venda.class, vendaId);
            if (v == null) {
                throw new EntidadeNaoExistenteException("Venda não existente!");
            }
            LinhaVenda lv = em.find(LinhaVenda.class, linhaVendaId);
            if (lv == null) {
                throw new EntidadeNaoExistenteException("Linha Venda não existente!");
            }
            lvb.removerLinhaVenda(linhaVendaId);
            v.removeLinhaVenda(lv);
            em.merge(vendaId);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public void atualizarLinhaVenda(int vendaId, int linhaVendaId, int quantidade) {
        try {
            
            Venda venda = em.find(Venda.class, vendaId);
            if (venda == null) {
                throw new EntidadeNaoExistenteException("Venda não existente!");
            }
            LinhaVenda lv = em.find(LinhaVenda.class, linhaVendaId);
            if (lv == null) {
                throw new EntidadeNaoExistenteException("Linha Venda não existente!");
            }
            if (lvb.atualizarLinhaVenda(linhaVendaId, quantidade) == 0) {
                venda.removeLinhaVenda(lv);
            }
            em.merge(venda);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    public List<VendaDTO> getAllVendas(){
        try {
            List<Venda> vendas = (List<Venda>) em.createNamedQuery("findAllVendas").getResultList();
            return copiarVendasParaDTOs(vendas);
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }

    public VendaDTO getVenda(int id){
        try {
            Venda venda = em.find(Venda.class, id);
            return (venda != null) ? copiarVendaParaDTO(venda): null;
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
    }
    
    private List<VendaDTO> copiarVendasParaDTOs(List<Venda> vendas) {
        List<VendaDTO> dtos = new ArrayList<>();

        for (Venda v : vendas) {
            dtos.add(new VendaDTO(v.getId(), v.getFarmacia().getId(), v.getDataVenda()));
        }
        return dtos;
    }

    private VendaDTO copiarVendaParaDTO(Venda venda) {
        return new VendaDTO(venda.getId(), venda.getFarmacia().getId(), venda.getDataVenda());
    }
    
    public double getPrecoVenda(int vendaId) {
        double price = 0.0;
        try {
            Venda venda = em.find(Venda.class, vendaId);
            price = venda.calcularPreco();
        } catch (Exception e) {
            throw new EJBException(e.getMessage());
        }
        return price;
    }

    
    
}
